package com.woshengqile;

import java.io.IOException;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Map;

import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.builder.EqualsBuilder;
import org.apache.commons.lang3.builder.HashCodeBuilder;

import com.woshengqile.util.FreeMarkerUtils;

import freemarker.template.TemplateException;

/**
 * 系统设置
 * 
 */
public class Setting implements Serializable {

	private static final long serialVersionUID = -1478999889661796840L;

	/**
	 * 缓存名称
	 */
	public static final String CACHE_NAME = "setting";

	/**
	 * 分隔符
	 */
	private static final String SEPARATOR = ",";

	/**
	 * 水印位置
	 */
	public enum WatermarkPosition {

		/**
		 * 无
		 */
		no,

		/**
		 * 左上
		 */
		topLeft,

		/**
		 * 右上
		 */
		topRight,

		/**
		 * 居中
		 */
		center,

		/**
		 * 左下
		 */
		bottomLeft,

		/**
		 * 右下
		 */
		bottomRight
	}

	/**
	 * 小数位精确方式
	 */
	public enum RoundType {

		/**
		 * 四舍五入
		 */
		roundHalfUp,

		/**
		 * 向上取整
		 */
		roundUp,

		/**
		 * 向下取整
		 */
		roundDown
	}


	/**
	 * 验证码类型
	 */
	public enum CaptchaType {

		/**
		 * 后台登录
		 */
		adminLogin,

		/**
		 * 忘记密码
		 */
		forgotPassword,

		/**
		 * 重置密码
		 */
		resetPassword,

		/**
		 * 其它
		 */
		other
	}
	
	/**
	 * 验证码类型
	 */
	public enum SmsType {

		/** 后台登录 */
		adminLogin,

		/** 找回密码 */
		findPassword,

		/** 重置手机 */
		resetMobile,
		
		/** 重置密码 */
		resetPassword,

		/** 其它 */
		other
	}

	/**
	 * 区域设置
	 */
	public enum Locale {

		/**
		 * 中文(简体, 中国)
		 */
		zh_CN,

		/**
		 * 中文(繁体, 台湾)
		 */
		zh_TW
	}

	/**
	 * 网站名称
	 */
	private String siteName;

	/**
	 * 网站网址
	 */
	private String siteUrl;
	
	/**
	 * 站点图片
	 */
	private String siteImageUrl;
	
	/**
	 * logo
	 */
	private String logo;

	/**
	 * 热门搜索
	 */
	private String hotSearch;
	
	/**
	 * 联系地址
	 */
	private String address;

	/**
	 * 联系电话
	 */
	private String phone;

	/**
	 * 邮政编码
	 */
	private String zipCode;

	/**
	 * E-mail
	 */
	private String email;

	/**
	 * 备案编号
	 */
	private String certtext;

	/**
	 * 图片(大)宽度
	 */
	private Integer largeImageWidth;

	/**
	 * 图片(大)高度
	 */
	private Integer largeImageHeight;

	/**
	 * 图片(中)宽度
	 */
	private Integer mediumImageWidth;

	/**
	 * 图片(中)高度
	 */
	private Integer mediumImageHeight;

	/**
	 * 缩略图宽度
	 */
	private Integer thumbnailImageWidth;

	/**
	 * 缩略图高度
	 */
	private Integer thumbnailImageHeight;

	/**
	 * 默认图片(大)
	 */
	private String defaultLargeImage;

	/**
	 * 默认图片(小)
	 */
	private String defaultMediumImage;

	/**
	 * 默认缩略图
	 */
	private String defaultThumbnailImage;

	/**
	 * 水印透明度
	 */
	private Integer watermarkAlpha;

	/**
	 * 水印图片
	 */
	private String watermarkImage;

	/**
	 * 水印位置
	 */
	private Setting.WatermarkPosition watermarkPosition;

	/**
	 * 价格精确位数
	 */
	private Integer priceScale;

	/**
	 * 价格精确方式
	 */
	private Setting.RoundType priceRoundType;

	/**
	 * 注册初始积分
	 */
	private Long registerPoint;
	
	/**
	 * 验证码类型
	 */
	private Setting.CaptchaType[] captchaTypes;

	/**
	 * 最大登录失败尝试次数
	 */
	private Integer maxFailedLoginAttempts;

	/**
	 * 密码锁定时间
	 */
	private Integer passwordLockTime;

	/**
	 * 安全密匙有效时间
	 */
	private Integer safeKeyExpiryTime;

	/**
	 * 上传文件最大限制
	 */
	private Integer uploadMaxSize;

	/**
	 * 允许上传图片扩展名
	 */
	private String uploadImageExtension;

	/**
	 * 允许上传媒体扩展名
	 */
	private String uploadMediaExtension;

	/**
	 * 允许上传文件扩展名
	 */
	private String uploadFileExtension;

	/**
	 * 图片上传路径
	 */
	private String imageUploadPath;

	/**
	 * 媒体上传路径
	 */
	private String mediaUploadPath;

	/**
	 * 文件上传路径
	 */
	private String fileUploadPath;
	
	/**
	 * 本地文件存储路径
	 */
	private String localStoragePath;

	/**
	 * 货币符号
	 */
	private String currencySign;

	/**
	 * 货币单位
	 */
	private String currencyUnit;

	/**
	 * Cookie路径
	 */
	private String cookiePath;

	/**
	 * Cookie作用域
	 */
	private String cookieDomain;

	/**
	 * 区域设置
	 */
	private Setting.Locale locale;
	
	/**
	 * 阿里邮件推送 - 发信地址
	 */
	private String aliyunAccountName;
	
	/**
	 * 阿里邮件推送 - 别名
	 */
	private String aliyunFromAlias;
	
	/**
	 * 阿里邮件推送 - 账号 0随机, 1与发信地址相同
	 */
	private Integer aliyunAddressType;
	
	/**
	 * 阿里邮件推送 - 阿里云AccessKey
	 */
	private String aliyunAccessKey;
	
	/**
	 * 阿里邮件推送 - 阿里云AccessSecret
	 */
	private String aliyunAccessSecret;
	
	/**
	 * 阿里邮件推送 - 发信区域
	 */
	private String region;

	/**
	 * 获取网站名称
	 * 
	 * @return 网站名称
	 */
	public String getSiteName() {
		return siteName;
	}

	/**
	 * 设置网站名称
	 * 
	 * @param siteName
	 *            网站名称
	 */
	public void setSiteName(String siteName) {
		this.siteName = siteName;
	}

	/**
	 * 获取网站网址
	 * 
	 * @return 网站网址
	 */
	public String getSiteUrl() {
		return siteUrl;
	}

	/**
	 * 设置网站网址
	 * 
	 * @param siteUrl
	 *            网站网址
	 */
	public void setSiteUrl(String siteUrl) {
		this.siteUrl = StringUtils.removeEnd(siteUrl, "/");
	}

	/**
	 * 获取图片网址
	 * 
	 * @return 图片网址
	 */
	public String getSiteImageUrl() {
		return siteImageUrl;
	}

	/**
	 * 设置图片网址
	 * 
	 * @param imageUrl
	 *            图片网址
	 */
	public void setSiteImageUrl(String siteImageUrl) {
		this.siteImageUrl = siteImageUrl;
	}
	
	/**
	 * 获取logo
	 * 
	 * @return logo
	 */
	public String getLogo() {
		return logo;
	}

	/**
	 * 设置logo
	 * 
	 * @param logo
	 *            logo
	 */
	public void setLogo(String logo) {
		this.logo = logo;
	}

	/**
	 * 获取热门搜索
	 * 
	 * @return 热门搜索
	 */
	public String getHotSearch() {
		return hotSearch;
	}

	/**
	 * 设置热门搜索
	 * 
	 * @param hotSearch
	 *            热门搜索
	 */
	public void setHotSearch(String hotSearch) {
		if (hotSearch != null) {
			hotSearch = hotSearch.replaceAll("[,\\s]*,[,\\s]*", ",").replaceAll("^,|,$", "");
		}
		this.hotSearch = hotSearch;
	}

	
	/**
	 * 获取联系地址
	 * 
	 * @return 联系地址
	 */
	public String getAddress() {
		return address;
	}

	/**
	 * 设置联系地址
	 * 
	 * @param address
	 *            联系地址
	 */
	public void setAddress(String address) {
		this.address = address;
	}

	/**
	 * 获取联系电话
	 * 
	 * @return 联系电话
	 */
	public String getPhone() {
		return phone;
	}

	/**
	 * 设置联系电话
	 * 
	 * @param phone
	 *            联系电话
	 */
	public void setPhone(String phone) {
		this.phone = phone;
	}

	/**
	 * 获取邮政编码
	 * 
	 * @return 邮政编码
	 */
	public String getZipCode() {
		return zipCode;
	}

	/**
	 * 设置邮政编码
	 * 
	 * @param zipCode
	 *            邮政编码
	 */
	public void setZipCode(String zipCode) {
		this.zipCode = zipCode;
	}

	/**
	 * 获取E-mail
	 * 
	 * @return E-mail
	 */
	public String getEmail() {
		return email;
	}

	/**
	 * 设置E-mail
	 * 
	 * @param email
	 *            E-mail
	 */
	public void setEmail(String email) {
		this.email = email;
	}

	/**
	 * 获取备案编号
	 * 
	 * @return 备案编号
	 */
	public String getCerttext() {
		return certtext;
	}

	/**
	 * 设置备案编号
	 * 
	 * @param certtext
	 *            备案编号
	 */
	public void setCerttext(String certtext) {
		this.certtext = certtext;
	}

	/**
	 * 获取图片(大)宽度
	 * 
	 * @return 图片(大)宽度
	 */
	public Integer getLargeImageWidth() {
		return largeImageWidth;
	}

	/**
	 * 设置图片(大)宽度
	 * 
	 * @param largeImageWidth
	 *            图片(大)宽度
	 */
	public void setLargeImageWidth(Integer largeImageWidth) {
		this.largeImageWidth = largeImageWidth;
	}

	/**
	 * 获取图片(大)高度
	 * 
	 * @return 图片(大)高度
	 */
	public Integer getLargeImageHeight() {
		return largeImageHeight;
	}

	/**
	 * 设置图片(大)高度
	 * 
	 * @param largeImageHeight
	 *            图片(大)高度
	 */
	public void setLargeImageHeight(Integer largeImageHeight) {
		this.largeImageHeight = largeImageHeight;
	}

	/**
	 * 获取图片(中)宽度
	 * 
	 * @return 图片(中)宽度
	 */
	public Integer getMediumImageWidth() {
		return mediumImageWidth;
	}

	/**
	 * 设置图片(中)宽度
	 * 
	 * @param mediumImageWidth
	 *            图片(中)宽度
	 */
	public void setMediumImageWidth(Integer mediumImageWidth) {
		this.mediumImageWidth = mediumImageWidth;
	}

	/**
	 * 获取图片(中)高度
	 * 
	 * @return 图片(中)高度
	 */
	public Integer getMediumImageHeight() {
		return mediumImageHeight;
	}

	/**
	 * 设置图片(中)高度
	 * 
	 * @param mediumImageHeight
	 *            图片(中)高度
	 */
	public void setMediumImageHeight(Integer mediumImageHeight) {
		this.mediumImageHeight = mediumImageHeight;
	}

	/**
	 * 获取缩略图宽度
	 * 
	 * @return 缩略图宽度
	 */
	public Integer getThumbnailImageWidth() {
		return thumbnailImageWidth;
	}

	/**
	 * 设置缩略图宽度
	 * 
	 * @param thumbnailImageWidth
	 *            缩略图宽度
	 */
	public void setThumbnailImageWidth(Integer thumbnailImageWidth) {
		this.thumbnailImageWidth = thumbnailImageWidth;
	}

	/**
	 * 获取缩略图高度
	 * 
	 * @return 缩略图高度
	 */
	public Integer getThumbnailImageHeight() {
		return thumbnailImageHeight;
	}

	/**
	 * 设置缩略图高度
	 * 
	 * @param thumbnailImageHeight
	 *            缩略图高度
	 */
	public void setThumbnailImageHeight(Integer thumbnailImageHeight) {
		this.thumbnailImageHeight = thumbnailImageHeight;
	}

	/**
	 * 获取默认图片(大)
	 * 
	 * @return 默认图片(大)
	 */
	public String getDefaultLargeImage() {
		return defaultLargeImage;
	}

	/**
	 * 设置默认图片(大)
	 * 
	 * @param defaultLargeImage
	 *            默认图片(大)
	 */
	public void setDefaultLargeImage(String defaultLargeImage) {
		this.defaultLargeImage = defaultLargeImage;
	}

	/**
	 * 获取默认图片(小)
	 * 
	 * @return 默认图片(小)
	 */
	public String getDefaultMediumImage() {
		return defaultMediumImage;
	}

	/**
	 * 设置默认图片(小)
	 * 
	 * @param defaultMediumImage
	 *            默认图片(小)
	 */
	public void setDefaultMediumImage(String defaultMediumImage) {
		this.defaultMediumImage = defaultMediumImage;
	}

	/**
	 * 获取默认缩略图
	 * 
	 * @return 默认缩略图
	 */
	public String getDefaultThumbnailImage() {
		return defaultThumbnailImage;
	}

	/**
	 * 设置默认缩略图
	 * 
	 * @param defaultThumbnailImage
	 *            默认缩略图
	 */
	public void setDefaultThumbnailImage(String defaultThumbnailImage) {
		this.defaultThumbnailImage = defaultThumbnailImage;
	}

	/**
	 * 获取水印透明度
	 * 
	 * @return 水印透明度
	 */
	public Integer getWatermarkAlpha() {
		return watermarkAlpha;
	}

	/**
	 * 设置水印透明度
	 * 
	 * @param watermarkAlpha
	 *            水印透明度
	 */
	public void setWatermarkAlpha(Integer watermarkAlpha) {
		this.watermarkAlpha = watermarkAlpha;
	}

	/**
	 * 获取水印图片
	 * 
	 * @return 水印图片
	 */
	public String getWatermarkImage() {
		return watermarkImage;
	}

	/**
	 * 设置水印图片
	 * 
	 * @param watermarkImage
	 *            水印图片
	 */
	public void setWatermarkImage(String watermarkImage) {
		this.watermarkImage = watermarkImage;
	}

	/**
	 * 获取水印位置
	 * 
	 * @return 水印位置
	 */
	public Setting.WatermarkPosition getWatermarkPosition() {
		return watermarkPosition;
	}

	/**
	 * 设置水印位置
	 * 
	 * @param watermarkPosition
	 *            水印位置
	 */
	public void setWatermarkPosition(Setting.WatermarkPosition watermarkPosition) {
		this.watermarkPosition = watermarkPosition;
	}

	/**
	 * 获取价格精确位数
	 * 
	 * @return 价格精确位数
	 */
	public Integer getPriceScale() {
		return priceScale;
	}

	/**
	 * 设置价格精确位数
	 * 
	 * @param priceScale
	 *            价格精确位数
	 */
	public void setPriceScale(Integer priceScale) {
		this.priceScale = priceScale;
	}

	/**
	 * 获取价格精确方式
	 * 
	 * @return 价格精确方式
	 */
	public Setting.RoundType getPriceRoundType() {
		return priceRoundType;
	}

	/**
	 * 设置价格精确方式
	 * 
	 * @param priceRoundType
	 *            价格精确方式
	 */
	public void setPriceRoundType(Setting.RoundType priceRoundType) {
		this.priceRoundType = priceRoundType;
	}

	/**
	 * 获取注册初始积分
	 * 
	 * @return 注册初始积分
	 */
	public Long getRegisterPoint() {
		return registerPoint;
	}

	/**
	 * 设置注册初始积分
	 * 
	 * @param registerPoint
	 *            注册初始积分
	 */
	public void setRegisterPoint(Long registerPoint) {
		this.registerPoint = registerPoint;
	}

	/**
	 * 获取验证码类型
	 * 
	 * @return 验证码类型
	 */
	public Setting.CaptchaType[] getCaptchaTypes() {
		return captchaTypes;
	}

	/**
	 * 设置验证码类型
	 * 
	 * @param captchaTypes
	 *            验证码类型
	 */
	public void setCaptchaTypes(Setting.CaptchaType[] captchaTypes) {
		this.captchaTypes = captchaTypes;
	}

	/**
	 * 获取最大登录失败尝试次数
	 * 
	 * @return 最大登录失败尝试次数
	 */
	public Integer getMaxFailedLoginAttempts() {
		return maxFailedLoginAttempts;
	}

	/**
	 * 设置最大登录失败尝试次数
	 * 
	 * @param maxFailedLoginAttempts
	 *            最大登录失败尝试次数
	 */
	public void setMaxFailedLoginAttempts(Integer maxFailedLoginAttempts) {
		this.maxFailedLoginAttempts = maxFailedLoginAttempts;
	}

	/**
	 * 获取密码锁定时间
	 * 
	 * @return 密码锁定时间
	 */
	public Integer getPasswordLockTime() {
		return passwordLockTime;
	}

	/**
	 * 设置密码锁定时间
	 * 
	 * @param passwordLockTime
	 *            密码锁定时间
	 */
	public void setPasswordLockTime(Integer passwordLockTime) {
		this.passwordLockTime = passwordLockTime;
	}

	/**
	 * 获取安全密匙有效时间
	 * 
	 * @return 安全密匙有效时间
	 */
	public Integer getSafeKeyExpiryTime() {
		return safeKeyExpiryTime;
	}

	/**
	 * 设置安全密匙有效时间
	 * 
	 * @param safeKeyExpiryTime
	 *            安全密匙有效时间
	 */
	public void setSafeKeyExpiryTime(Integer safeKeyExpiryTime) {
		this.safeKeyExpiryTime = safeKeyExpiryTime;
	}

	/**
	 * 获取上传文件最大限制
	 * 
	 * @return 上传文件最大限制
	 */
	public Integer getUploadMaxSize() {
		return uploadMaxSize;
	}

	/**
	 * 设置上传文件最大限制
	 * 
	 * @param uploadMaxSize
	 *            上传文件最大限制
	 */
	public void setUploadMaxSize(Integer uploadMaxSize) {
		this.uploadMaxSize = uploadMaxSize;
	}

	/**
	 * 获取允许上传图片扩展名
	 * 
	 * @return 允许上传图片扩展名
	 */
	public String getUploadImageExtension() {
		return uploadImageExtension;
	}

	/**
	 * 设置允许上传图片扩展名
	 * 
	 * @param uploadImageExtension
	 *            允许上传图片扩展名
	 */
	public void setUploadImageExtension(String uploadImageExtension) {
		if (uploadImageExtension != null) {
			uploadImageExtension = uploadImageExtension.replaceAll("[,\\s]*,[,\\s]*", ",").replaceAll("^,|,$", "").toLowerCase();
		}
		this.uploadImageExtension = uploadImageExtension;
	}

	/**
	 * 获取允许上传媒体扩展名
	 * 
	 * @return 允许上传媒体扩展名
	 */
	public String getUploadMediaExtension() {
		return uploadMediaExtension;
	}

	/**
	 * 设置允许上传媒体扩展名
	 * 
	 * @param uploadMediaExtension
	 *            允许上传媒体扩展名
	 */
	public void setUploadMediaExtension(String uploadMediaExtension) {
		if (uploadMediaExtension != null) {
			uploadMediaExtension = uploadMediaExtension.replaceAll("[,\\s]*,[,\\s]*", ",").replaceAll("^,|,$", "").toLowerCase();
		}
		this.uploadMediaExtension = uploadMediaExtension;
	}

	/**
	 * 获取允许上传文件扩展名
	 * 
	 * @return 允许上传文件扩展名
	 */
	public String getUploadFileExtension() {
		return uploadFileExtension;
	}

	/**
	 * 设置允许上传文件扩展名
	 * 
	 * @param uploadFileExtension
	 *            允许上传文件扩展名
	 */
	public void setUploadFileExtension(String uploadFileExtension) {
		if (uploadFileExtension != null) {
			uploadFileExtension = uploadFileExtension.replaceAll("[,\\s]*,[,\\s]*", ",").replaceAll("^,|,$", "").toLowerCase();
		}
		this.uploadFileExtension = uploadFileExtension;
	}

	/**
	 * 获取图片上传路径
	 * 
	 * @return 图片上传路径
	 */
	public String getImageUploadPath() {
		return imageUploadPath;
	}

	/**
	 * 设置图片上传路径
	 * 
	 * @param imageUploadPath
	 *            图片上传路径
	 */
	public void setImageUploadPath(String imageUploadPath) {
		if (imageUploadPath != null) {
			if (!imageUploadPath.startsWith("/")) {
				imageUploadPath = "/" + imageUploadPath;
			}
			if (!imageUploadPath.endsWith("/")) {
				imageUploadPath += "/";
			}
		}
		this.imageUploadPath = imageUploadPath;
	}

	/**
	 * 获取媒体上传路径
	 * 
	 * @return 媒体上传路径
	 */
	public String getMediaUploadPath() {
		return mediaUploadPath;
	}

	/**
	 * 设置媒体上传路径
	 * 
	 * @param mediaUploadPath
	 *            媒体上传路径
	 */
	public void setMediaUploadPath(String mediaUploadPath) {
		if (mediaUploadPath != null) {
			if (!mediaUploadPath.startsWith("/")) {
				mediaUploadPath = "/" + mediaUploadPath;
			}
			if (!mediaUploadPath.endsWith("/")) {
				mediaUploadPath += "/";
			}
		}
		this.mediaUploadPath = mediaUploadPath;
	}

	/**
	 * 获取文件上传路径
	 * 
	 * @return 文件上传路径
	 */
	public String getFileUploadPath() {
		return fileUploadPath;
	}

	/**
	 * 设置文件上传路径
	 * 
	 * @param fileUploadPath
	 *            文件上传路径
	 */
	public void setFileUploadPath(String fileUploadPath) {
		if (fileUploadPath != null) {
			if (!fileUploadPath.startsWith("/")) {
				fileUploadPath = "/" + fileUploadPath;
			}
			if (!fileUploadPath.endsWith("/")) {
				fileUploadPath += "/";
			}
		}
		this.fileUploadPath = fileUploadPath;
	}

	/**
	 * 获取本地文件存储路径
	 * 
	 * @return 本地文件存储路径
	 */
	public String getLocalStoragePath() {
		return localStoragePath;
	}

	/**
	 * 设置本地文件存储路径
	 * 
	 * @param localStoragePath
	 *            本地文件存储路径
	 */
	public void setLocalStoragePath(String localStoragePath) {
		this.localStoragePath = localStoragePath;
	}
	
	/**
	 * 获取货币符号
	 * 
	 * @return 货币符号
	 */
	public String getCurrencySign() {
		return currencySign;
	}

	/**
	 * 设置货币符号
	 * 
	 * @param currencySign
	 *            货币符号
	 */
	public void setCurrencySign(String currencySign) {
		this.currencySign = currencySign;
	}

	/**
	 * 获取货币单位
	 * 
	 * @return 货币单位
	 */
	public String getCurrencyUnit() {
		return currencyUnit;
	}

	/**
	 * 设置货币单位
	 * 
	 * @param currencyUnit
	 *            货币单位
	 */
	public void setCurrencyUnit(String currencyUnit) {
		this.currencyUnit = currencyUnit;
	}

	/**
	 * 获取Cookie路径
	 * 
	 * @return Cookie路径
	 */
	public String getCookiePath() {
		return cookiePath;
	}

	/**
	 * 设置Cookie路径
	 * 
	 * @param cookiePath
	 *            Cookie路径
	 */
	public void setCookiePath(String cookiePath) {
		if (cookiePath != null && !cookiePath.endsWith("/")) {
			cookiePath += "/";
		}
		this.cookiePath = cookiePath;
	}

	/**
	 * 获取Cookie作用域
	 * 
	 * @return Cookie作用域
	 */
	public String getCookieDomain() {
		return cookieDomain;
	}

	/**
	 * 设置Cookie作用域
	 * 
	 * @param cookieDomain
	 *            Cookie作用域
	 */
	public void setCookieDomain(String cookieDomain) {
		this.cookieDomain = cookieDomain;
	}

	/**
	 * 获取区域设置
	 * 
	 * @return 区域设置
	 */
	public Setting.Locale getLocale() {
		return locale;
	}

	/**
	 * 设置区域设置
	 * 
	 * @param locale
	 *            区域设置
	 */
	public void setLocale(Setting.Locale locale) {
		this.locale = locale;
	}
	
	/**
	 * 阿里邮件推送 - 发信地址
	 * @return
	 */
	public String getAliyunAccountName() {
		return aliyunAccountName;
	}

	/**
	 * 阿里邮件推送 - 发信地址
	 * @param aliyunAccountName
	 */
	public void setAliyunAccountName(String aliyunAccountName) {
		this.aliyunAccountName = aliyunAccountName;
	}

	/**
	 * 阿里邮件推送 - 别名
	 * @return
	 */
	public String getAliyunFromAlias() {
		return aliyunFromAlias;
	}

	/**
	 * 阿里邮件推送 - 别名
	 * @param aliyunFromAlias
	 */
	public void setAliyunFromAlias(String aliyunFromAlias) {
		this.aliyunFromAlias = aliyunFromAlias;
	}

	/**
	 * 阿里邮件推送 - 账号 0随机, 1与发信地址相同
	 * @return
	 */
	public Integer getAliyunAddressType() {
		return aliyunAddressType;
	}

	/**
	 * 阿里邮件推送 - 账号 0随机, 1与发信地址相同
	 * @param aliyunAddressType
	 */
	public void setAliyunAddressType(Integer aliyunAddressType) {
		this.aliyunAddressType = aliyunAddressType;
	}

	/**
	 * 阿里邮件推送 - 阿里云AccessKey
	 * @return
	 */
	public String getAliyunAccessKey() {
		return aliyunAccessKey;
	}

	/**
	 * 阿里邮件推送 - 阿里云AccessKey
	 * @param aliyunAccessKey
	 */
	public void setAliyunAccessKey(String aliyunAccessKey) {
		this.aliyunAccessKey = aliyunAccessKey;
	}

	/**
	 * 阿里邮件推送 - 阿里云AccessSecret
	 * @return
	 */
	public String getAliyunAccessSecret() {
		return aliyunAccessSecret;
	}

	/**
	 * 阿里邮件推送 - 阿里云AccessSecret
	 * @param aliyunAccessSecret
	 */
	public void setAliyunAccessSecret(String aliyunAccessSecret) {
		this.aliyunAccessSecret = aliyunAccessSecret;
	}
	
	/**
	 * 阿里邮件推送 - 发信区域
	 * @return
	 */
	public String getRegion() {
		return region;
	}
	
	/**
	 * 阿里邮件推送 - 发信区域
	 * @param region
	 */
	public void setRegion(String region) {
		this.region = region;
	}

	/**
	 * 获取热门搜索关键词
	 * 
	 * @return 热门搜索关键词
	 */
	public String[] getHotSearches() {
		return StringUtils.split(hotSearch, SEPARATOR);
	}

	/**
	 * 获取允许上传图片扩展名
	 * 
	 * @return 允许上传图片扩展名
	 */
	public String[] getUploadImageExtensions() {
		return StringUtils.split(uploadImageExtension, SEPARATOR);
	}

	/**
	 * 获取允许上传媒体扩展名
	 * 
	 * @return 允许上传媒体扩展名
	 */
	public String[] getUploadMediaExtensions() {
		return StringUtils.split(uploadMediaExtension, SEPARATOR);
	}

	/**
	 * 获取允许上传文件扩展名
	 * 
	 * @return 允许上传文件扩展名
	 */
	public String[] getUploadFileExtensions() {
		return StringUtils.split(uploadFileExtension, SEPARATOR);
	}

	/**
	 * 设置精度
	 * 
	 * @param amount
	 *            数值
	 * @return 数值
	 */
	public BigDecimal setScale(BigDecimal amount) {
		if (amount != null && getPriceScale() != null && getPriceRoundType() != null) {
			switch (getPriceRoundType()) {
			case roundUp:
				return amount.setScale(getPriceScale(), BigDecimal.ROUND_UP);
			case roundDown:
				return amount.setScale(getPriceScale(), BigDecimal.ROUND_DOWN);
			case roundHalfUp:
				return amount.setScale(getPriceScale(), BigDecimal.ROUND_HALF_UP);
			}
		}
		return amount;
	}

	/**
	 * 解析图片上传路径
	 * 
	 * @return 图片上传路径
	 */
	public String resolveImageUploadPath() {
		return resolveImageUploadPath(null);
	}

	/**
	 * 解析图片上传路径
	 * 
	 * @param model
	 *            数据
	 * @return 图片上传路径
	 */
	public String resolveImageUploadPath(Map<String, Object> model) {
		try {
			return FreeMarkerUtils.process(getImageUploadPath(), model);
		} catch (IOException e) {
			throw new RuntimeException(e.getMessage(), e);
		} catch (TemplateException e) {
			throw new RuntimeException(e.getMessage(), e);
		}
	}

	/**
	 * 解析媒体上传路径
	 * 
	 * @return 媒体上传路径
	 */
	public String resolveMediaUploadPath() {
		return resolveMediaUploadPath(null);
	}

	/**
	 * 解析媒体上传路径
	 * 
	 * @param model
	 *            数据
	 * @return 媒体上传路径
	 */
	public String resolveMediaUploadPath(Map<String, Object> model) {
		try {
			return FreeMarkerUtils.process(getMediaUploadPath(), model);
		} catch (IOException e) {
			throw new RuntimeException(e.getMessage(), e);
		} catch (TemplateException e) {
			throw new RuntimeException(e.getMessage(), e);
		}
	}

	/**
	 * 解析文件上传路径
	 * 
	 * @return 文件上传路径
	 */
	public String resolveFileUploadPath() {
		return resolveFileUploadPath(null);
	}

	/**
	 * 解析文件上传路径
	 * 
	 * @param model
	 *            数据
	 * @return 文件上传路径
	 */
	public String resolveFileUploadPath(Map<String, Object> model) {
		try {
			return FreeMarkerUtils.process(getFileUploadPath(), model);
		} catch (IOException e) {
			throw new RuntimeException(e.getMessage(), e);
		} catch (TemplateException e) {
			throw new RuntimeException(e.getMessage(), e);
		}
	}

	/**
	 * 重写equals方法
	 * 
	 * @param obj
	 *            对象
	 * @return 是否相等
	 */
	@Override
	public boolean equals(Object obj) {
		return EqualsBuilder.reflectionEquals(this, obj);
	}

	/**
	 * 重写hashCode方法
	 * 
	 * @return HashCode
	 */
	@Override
	public int hashCode() {
		return HashCodeBuilder.reflectionHashCode(this);
	}

}
